home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload Trio 2 / Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO / dir43 / med300.zip / MEREFORM.CLA < prev    next >
Text File  |  1994-02-22  |  6KB  |  169 lines

  1.  
  2. !▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  3. !█                                     █
  4. !█ MEREFORM.CLA                                                          █
  5. !█ Document and paragraph reformatting                     █
  6. !█                                     █
  7. !█ Revision Number: 1                             █
  8. !█ Revision Date  : 22-Feb-94                                            █
  9. !█                                     █
  10. !█ Revision History                             █
  11. !█   1 Created                                 █
  12. !█                                     █
  13. !▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  14.  
  15.               MEMBER('MEMOEDIT')
  16.  
  17. !─────────────────────────────────────────────────────────────────────────
  18. !                 Local Module MAP
  19. !─────────────────────────────────────────────────────────────────────────
  20.           MAP
  21.                 ME_Chars(),USHORT                ! Count characters in buffer
  22.           .
  23.  
  24. !═══════════════════════════════════════════════════════════════════════
  25. !     Returns number of characters in document (less trailing spaces)
  26. !═══════════════════════════════════════════════════════════════════════
  27. ME_Chars      FUNCTION
  28.  
  29.           ! Locals:
  30. ulLastChar    ULONG                 ! Last character offset
  31. usNChars      USHORT                 ! Number of characters
  32. ubChar          BYTE                 ! Character code
  33.  
  34.   CODE
  35.   ulLastChar = MED:ulEditBuffer + (MED:usMaxChars - 1)
  36.   usNChars   = MED:usMaxChars                    !
  37.   LOOP WHILE usNChars                 !
  38.     PEEK(ulLastChar, ubChar)             !
  39.     IF ubChar <> 20H THEN BREAK.         !
  40.     ulLastChar -= 1                 !
  41.     usNChars   -= 1                 !
  42.   .                         !
  43.   RETURN( usNChars + 1 )
  44.  
  45.  
  46. !═══════════════════════════════════════════════════════════════════════
  47. !             Determine line break position
  48. !═══════════════════════════════════════════════════════════════════════
  49. ME_LineBreak  FUNCTION( usOffset, usMaxWidth )
  50.  
  51.           ! Locals:
  52. ulAddress     ULONG                 ! Address
  53. usIndex          USHORT                     ! Offset
  54. usSavPos      USHORT                  ! Saved offset
  55. usWidth          USHORT                 ! Line width
  56. ubChar          BYTE                 ! Character
  57. bbSpaceFlag   BYTE                 ! Space flag
  58.  
  59.   CODE
  60.   usIndex     = usOffset                     ! Set initial values
  61.   usSavPos    = usIndex                 !
  62.   usWidth     = 0                 !
  63.   bbSpaceFlag = 0                 !
  64.  
  65.   LOOP WHILE usIndex < MED:usCharacters          ! Loop for each character
  66.     ulAddress = MED:ulEditBuffer + usIndex       !   Form address
  67.     PEEK(ulAddress, ubChar)                     !   Get character code
  68.     usWidth += 1                 !   Update line width
  69.     IF usWidth >= usMaxWidth             !   If line too long
  70.       IF bbSpaceFlag THEN usIndex = usSavPos + 1.!     Stop at last space
  71.       BREAK                     !     Break
  72.     ELSIF ubChar = eHRt                 !   Else if HRt
  73.       usIndex += 1                 !     Stop at HRt
  74.       BREAK                     !     Break
  75.     ELSIF ubChar = 20H                 !   Elsif space character
  76.       usSavPos      = usIndex             !     Save position
  77.       bbSpaceFlag = 1                 !     Set flag
  78.     .                         !   Endif
  79.     usIndex += 1                 !   Update index
  80.   .                         ! End loop
  81.   IF usIndex > usOffset                 ! Return line break position
  82.     RETURN( usIndex - usOffset )         !
  83.   ELSE                         !
  84.     RETURN( 1 )                     !
  85.   .                         !
  86.  
  87.  
  88. !═══════════════════════════════════════════════════════════════════════
  89. !            Reformat entire document
  90. !═══════════════════════════════════════════════════════════════════════
  91. ME_ReformDoc  PROCEDURE
  92.  
  93.           ! Locals:
  94. usOffset      SHORT                 ! Buffer offset
  95.  
  96.   CODE
  97.   MED:usCharacters = ME_Chars()                  ! Set character count
  98.   FREE(qLine)                     ! Free line table
  99.   usOffset = 0                     ! Start at first char
  100.   QLN:bbRedisplay = 1                 ! Save first table entry
  101.   QLN:usLineStart = usOffset             !
  102.   ADD(qLine)                     !
  103.   LOOP                         ! Loop
  104.     usOffset += ME_LineBreak(usOffset, MED:usLineWidth)
  105.     IF usOffset >= MED:usCharacters THEN BREAK.  !   Break if past last char
  106.     QLN:bbRedisplay = 1                 !   Save line table entry
  107.     QLN:usLineStart = usOffset             !
  108.     ADD(qLine)                     !
  109.   .                         ! End loop
  110.   RETURN
  111.  
  112.  
  113. !═══════════════════════════════════════════════════════════════════════
  114. !      Reformat from current position until line break sync
  115. !═══════════════════════════════════════════════════════════════════════
  116. ME_ReformPar PROCEDURE( usOffset )
  117.  
  118.           ! Locals:
  119. usLineIndex   USHORT                 ! Line index
  120. usSyncDelay   USHORT                 ! Sync delay count
  121. bbSyncFlag    BYTE                 ! Sync flag
  122.  
  123.   CODE
  124.   usLineIndex = ME_LineIndex( usOffset )         ! Set initial values
  125.   usSyncDelay = 1                 !
  126.   bbSyncFlag  = 0                 !
  127.  
  128.   IF usLineIndex > 1                 ! If not at first line
  129.     usLineIndex -= 1                 !   Start at previous line
  130.     usSyncDelay += 1                 !   and compensate sync
  131.   .                         ! Endif
  132.  
  133.   GET(qLine, usLineIndex)             ! Get line start
  134.   usOffset = QLN:usLineStart             !
  135.  
  136.   QLN:bbRedisplay = 1                 ! Set current line
  137.   DO UpdateTable                 ! for redisplay
  138.  
  139.   LOOP                         ! Loop
  140.     usOffset += ME_LineBreak(usOffset, MED:usLineWidth)
  141.     IF usOffset >= MED:usCharacters THEN BREAK.  !   Break if past last char
  142.     usLineIndex += 1                 !   Update line index
  143.     GET(qLine, usLineIndex)             !   If line sync established
  144.     IF (usOffset = QLN:usLineStart) AND (usSyncDelay = 0)
  145.       bbSyncFlag = 1                 !     Set flag
  146.       BREAK                     !     Break
  147.     .                         !   Endif
  148.     IF usSyncDelay THEN usSyncDelay -= 1.     !   Decrement delay count
  149.     QLN:usLineStart = usOffset             !   Update line table entry
  150.     QLN:bbRedisplay = 1                 !
  151.     DO UpdateTable                 !
  152.   .                         ! End loop
  153.   IF (NOT bbSyncFlag)                 ! If sync not established
  154.     LOOP WHILE usLineIndex < RECORDS(qLine)     !   Remove extra table entries
  155.       GET(qLine, RECORDS(qLine))         !
  156.       DELETE(qLine)                 !
  157.   . .                         ! Endif
  158.   RETURN
  159.  
  160. !──────────────────────────────────────────────────────────────────────────
  161. UpdateTable   ROUTINE       ! Update line table
  162. !──────────────────────────────────────────────────────────────────────────
  163.   IF usLineIndex > RECORDS(qLine)         ! If index not in table range
  164.     ADD(qLine)                     !   Add new entry
  165.   ELSE                         ! Else
  166.     PUT(qLine)                     !   Update existing entry
  167.   .                         ! Endif
  168.  
  169.